From 18dea5104f3de79af5e9641a0ef47435b112d44b Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Tue, 28 Aug 2018 00:32:47 +0200 Subject: [PATCH] special case all 0 to map to all 0 in nonpremul A test in GEGL relies on this, and keeping zeroed memory zeroed is good for compression and some other heuristics that might run on a buffer. --- babl/base/model-gray.c | 14 ++++++++++++++ babl/base/model-rgb.c | 14 ++++++++++++++ extensions/double.c | 4 ++++ extensions/fast-float.c | 2 ++ extensions/float.c | 8 ++++++++ extensions/gegl-fixups.c | 4 ++++ extensions/sse2-float.c | 13 +++++++++++++ 7 files changed, 59 insertions(+) diff --git a/babl/base/model-gray.c b/babl/base/model-gray.c index b7d80e1..33df8dc 100644 --- a/babl/base/model-gray.c +++ b/babl/base/model-gray.c @@ -477,6 +477,8 @@ rgba_to_gray_alpha_premultiplied (Babl *conversion, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (red == 0.0 && green == 0.0 && blue == 0.0) + alpha = 0.0; } luminance = red * RGB_LUMINANCE_RED + @@ -509,10 +511,20 @@ non_premultiplied_to_premultiplied (Babl *conversion, double alpha = *(double *) src[src_bands-1]; if (alpha < BABL_ALPHA_FLOOR) { + int non_zero_components = 0; if (alpha >= 0.0f) alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + + for (band = 0; band < src_bands - 1; band++) + { + if (*(double *) src[band] != 0.0) + non_zero_components++; + } + if (non_zero_components) + alpha = 0.0; + } for (band = 0; band < src_bands - 1; band++) @@ -584,6 +596,8 @@ rgba2gray_nonlinear_premultiplied (Babl *conversion, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (red == 0.0 && green == 0.0 && blue == 0.0) + alpha = 0.0; } luminance = red * RGB_LUMINANCE_RED + diff --git a/babl/base/model-rgb.c b/babl/base/model-rgb.c index c9cd5e0..e5d09f9 100644 --- a/babl/base/model-rgb.c +++ b/babl/base/model-rgb.c @@ -327,10 +327,16 @@ non_premultiplied_to_premultiplied (Babl *conversion, if (alpha < BABL_ALPHA_FLOOR) { + int non_zero_components = 0; if (alpha >= 0.0) alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + for (band = 0 ; band< src_bands-1; band++) + if (*(double *) src[band] != 0.0) + non_zero_components++; + if (non_zero_components == 0) + alpha = 0.0; } for (band = 0; band < src_bands - 1; band++) @@ -400,6 +406,10 @@ rgba2rgba_nonlinear_premultiplied (Babl *conversion, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (((double *) src)[0] == 0.0 && + ((double *) src)[1] == 0.0 && + ((double *) src)[2] == 0.0) + alpha = 0.0; } ((double *) dst)[0] = babl_trc_from_linear (trc[0], ((double *) src)[0]) * alpha; @@ -575,6 +585,10 @@ rgba2rgba_perceptual_premultiplied (Babl *conversion, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (((double *) src)[0] == 0.0 && + ((double *) src)[1] == 0.0 && + ((double *) src)[2] == 0.0) + alpha = 0.0; } ((double *) dst)[0] = babl_trc_from_linear (trc, ((double *) src)[0]) * alpha; diff --git a/extensions/double.c b/extensions/double.c index 502a466..7551ab2 100644 --- a/extensions/double.c +++ b/extensions/double.c @@ -48,6 +48,10 @@ conv_rgbaD_linear_rgbAD_gamma (const Babl *conversion,unsigned char *src, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (fsrc[0] == 0.0f && + fsrc[1] == 0.0f && + fsrc[2] == 0.0f) + alpha = 0.0f; } *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * alpha; *fdst++ = babl_trc_from_linear (trc[1], *fsrc++) * alpha; diff --git a/extensions/fast-float.c b/extensions/fast-float.c index 5540185..fcc1b67 100644 --- a/extensions/fast-float.c +++ b/extensions/fast-float.c @@ -315,6 +315,8 @@ conv_rgbaF_linear_rgbAF_gamma (const Babl *conversion,unsigned char *src, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (red == 0.0f && green == 0.0f && blue == 0.0f) + alpha = 0.0f; } *fdst++ = linear_to_gamma_2_2_lut (red) * alpha; *fdst++ = linear_to_gamma_2_2_lut (green) * alpha; diff --git a/extensions/float.c b/extensions/float.c index eaa38f5..8ffd7ab 100644 --- a/extensions/float.c +++ b/extensions/float.c @@ -49,6 +49,10 @@ conv_rgbaF_linear_rgbAF_nonlinear (const Babl *conversion,unsigned char *src, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (fsrc[0] == 0.0f && + fsrc[1] == 0.0f && + fsrc[2] == 0.0f) + alpha = 0.0f; } *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * alpha; *fdst++ = babl_trc_from_linear (trc[1], *fsrc++) * alpha; @@ -76,6 +80,10 @@ conv_rgbaF_linear_rgbAF_perceptual (const Babl *conversion,unsigned char *src, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (fsrc[0] == 0.0f && + fsrc[1] == 0.0f && + fsrc[2] == 0.0f) + alpha = 0.0f; } *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * alpha; *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * alpha; diff --git a/extensions/gegl-fixups.c b/extensions/gegl-fixups.c index 70ef2d3..8a8fe08 100644 --- a/extensions/gegl-fixups.c +++ b/extensions/gegl-fixups.c @@ -386,6 +386,10 @@ conv_rgbaF_rgbAF (const Babl *conversion,unsigned char *srcc, alpha = BABL_ALPHA_FLOOR; else if (alpha >= -BABL_ALPHA_FLOOR) alpha = -BABL_ALPHA_FLOOR; + if (src[0] == 0.0f && + src[1] == 0.0f && + src[2] == 0.0f) + alpha = 0.0f; } dst[0] = src[0] * alpha; dst[1] = src[1] * alpha; diff --git a/extensions/sse2-float.c b/extensions/sse2-float.c index 02a8c2d..24aaa7b 100644 --- a/extensions/sse2-float.c +++ b/extensions/sse2-float.c @@ -60,6 +60,11 @@ conv_rgbaF_linear_rgbAF_linear (const Babl *conversion,const float *src, float * ((float *)s)[3] = BABL_ALPHA_FLOOR; else ((float *)s)[3] = -BABL_ALPHA_FLOOR; + + if (((float *)s)[0] == 0.0f && + ((float *)s)[1] == 0.0f && + ((float *)s)[2] == 0.0f) + ((float *)s)[3] = 0.0f; } if (alpha1 < BABL_ALPHA_FLOOR) { @@ -67,6 +72,10 @@ conv_rgbaF_linear_rgbAF_linear (const Babl *conversion,const float *src, float * ((float *)s)[7] = BABL_ALPHA_FLOOR; else ((float *)s)[7] = -BABL_ALPHA_FLOOR; + if (((float *)s)[4] == 0.0f && + ((float *)s)[5] == 0.0f && + ((float *)s)[6] == 0.0f) + ((float *)s)[7] = 0.0f; } { __v4sf rbaa0, rbaa1; @@ -109,6 +118,10 @@ conv_rgbaF_linear_rgbAF_linear (const Babl *conversion,const float *src, float * a = BABL_ALPHA_FLOOR; else if (a >= -BABL_ALPHA_FLOOR) a = -BABL_ALPHA_FLOOR; + if (src[0] == 0.0f && + src[1] == 0.0f && + src[2] == 0.0f) + a = 0.0f; } dst[0] = src[0] * a; dst[1] = src[1] * a; -- 2.30.2